#pragma once
#include "sentencia.h"
#include "expr.h"
class Retorne :
	public Sentencia
{
public:

	Retorne(Sentencia *next,Expr* expr):Sentencia(next)
	{
		this->expr=expr;
		
	}

	~Retorne(void)
	{
	}
	virtual string is(){
		return "RETORNE";
	}

	void setExpr(Expr*expr){
		this->expr=expr;
	}

	Expr* getExpr(){
		return this->expr;
	}

	virtual tipo_ts * validarSemantica(tabla_simbolos *tabla_de_tipo,tabla_simbolos *tabla_de_varaible){
		tipo_ts *tts = this->expr->validarSemantica(tabla_de_tipo,tabla_de_varaible);
		tipo_ts *retorne = this->GetReturn();
		if(retorne!=0){
			if(tts->is().compare(this->GetReturn()->is())==0){
				return tts;
			}else{
				stringstream out;
			out<<"Tipo de Retorno no es correcto"<<endl;
			throw exception(out.str().c_str());
			}
		}else{
			stringstream out;
			out<<"Retorne solo se puede llamar dentro de una funcion"<<endl;
			throw exception(out.str().c_str());
		}
	}

private:
	Expr* expr;

};

